iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Modern Web

前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁系列 第 23

Day23 Spring boot後端開發 - 指定週數API

  • 分享至 

  • xImage
  •  

前言

接下來我們要開始學習如何取得某一週的帳務。在全端的開發過程中,比較順的方式是從後端一路開發到前端,而後端的開發又是從對於資料庫操作開始,然後是服務層,最後是控制層,一層一層的開發過來。
在經歷前面20天的練習,我相信大家已經開始熟練了這個流程,接下來就是更進階一點的教大家一些變化的技巧。
今天的目標是開發從資料庫中取得一週區間的教學,就讓我們開始吧!

開發Repository層

這個需求跟其他的不一樣的地方在於,我們需要取得某個時段的資料,因為Repository並沒有預設的方法,所以我們必須要新增一個指令,取得某個區段下的資料。
整個程式碼如下

package net.Eric.accounting.repository;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import net.Eric.accounting.entity.Account;

public interface AccountRepository extends JpaRepository<Account, Long>{
	
	List<Account> findByCategory(String category);
	List<Account> findAllByCreateDateBetween(LocalDateTime startDate, LocalDateTime endDate);
}

Service層開發

這裡的Service層的需求就跟Repository不太相同,因為我們要取得的是週數,所以我們進來的資料是年與週,我們得到年份與週數之後,再藉由程式去取得實際的開始與結束時間,然後去取得資料。
所以Service層我們要開發這個功能

	List<AccountDto> getAccountsByWeek(int year, int week);

接下來回到ServiceImpl,我們要開始新增開始與結束日期,首先,我們要先取得週數的資訊,我們可以使用weekFields這個類別來宣告週數
WeekFields 是 Java 中 java.time.temporal 套件的一部分,用於定義與週(星期)相關的字段。它允許你指定特定的星期制(例如週的起始日是星期幾,還有一年的第一週如何計算)來進行時間的運算。這對於不同地區有不同的星期計算規則非常有用。
接下來,我們就要設置開始與結束的時間
這段程式碼的目的是根據特定的年份和週數,找出該週的起始日期(週一)和結束日期(週日),然後將這一週的起始和結束時間轉換為具體的時間範圍(從週一的00:00到週日的23:59:59)。

  1. WeekFields weekFields = WeekFields.of(Locale.getDefault());
    • 這行程式碼根據系統預設的語言環境來決定「一週的起始日」和「如何計算週數」的規則。例如,在台灣,週一是每週的第一天,而在美國,週日可能被視為一週的第一天。
  2. LocalDate startDate = LocalDate.now().withYear(year).with(weekFields.weekOfYear(), week).with(weekFields.dayOfWeek(), 1);
    • 這行的功能是計算出給定年份和週數中的週一的日期:
      • withYear(year):設定要查詢的年份。
      • with(weekFields.weekOfYear(), week):設定要查詢的第幾週。
      • with(weekFields.dayOfWeek(), 1):設定這一週的第一天,也就是週一的日期。
  3. LocalDate endDate = startDate.plusDays(6);
    • 這行的作用是從計算出的週一開始,往後加6天,這樣就能得到同一週的週日日期。
  4. LocalDateTime startDateTime = startDate.atStartOfDay();
    • 將週一的日期轉換為這一天的開始時間(00:00:00)。
  5. LocalDateTime endDateTime = endDate.atTime(23, 59, 59);
    • 將週日的日期轉換為這一天的結束時間(23:59:59)
      這樣我們就會取得開始到結束的時間,接下來就是呼叫Repository,輸入開始與結束的日期,取得指定區間的資料,在取得之後,還要轉換成給前端看的資料,就要用前幾天我們教的方法,進行maping。
@Override

	public List<AccountDto> getAccountsByWeek(int year, int week) {

		   // 計算該週的起始日期和結束日期

        WeekFields weekFields = WeekFields.of(Locale.getDefault());

        LocalDate startDate = LocalDate.now()

            .withYear(year)

            .with(weekFields.weekOfYear(), week)

            .with(weekFields.dayOfWeek(), 1); // 週一

        LocalDate endDate = startDate.plusDays(6); // 週日

        LocalDateTime startDateTime = startDate.atStartOfDay();

        LocalDateTime endDateTime = endDate.atTime(23, 59, 59);




        // 查詢符合條件的帳戶資料

        List<Account> accounts = accountRepository.findAllByCreateDateBetween(startDateTime, endDateTime);




        // 將 Entity 轉換為 DTO

        return accounts.stream().map(account -> new AccountDto(

                account.getId(),

                account.getName(),

                account.getExpensed(),

                account.getCategory(),

                account.getAmount(),

                account.getCreateDate()

        )).collect(Collectors.toList());

	}

controller開發

最終,我們在Controller層中要設置這個API,藉由提供year跟week的資料去取得相關結果

    @GetMapping("/weekly/{year}/{week}")
    public List<AccountDto> getAccountsByWeek(@PathVariable("year") int year, @PathVariable("week") int week) {
        return accountsService.getAccountsByWeek(year, week);
    }

Postman 結果

最後,我們可以在Postman測試,只要能夠正常回傳,就OK囉!

https://ithelp.ithome.com.tw/upload/images/20241001/20152864hI4qL7lD1A.png


上一篇
Day22 React前端網頁- 網址連結以及設置Header連結
下一篇
Day24 React前端開發 : 根據指定週數顯示帳目的網頁
系列文
前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言